package module

import (
	"fmt"
	"os"
	"path/filepath"

	"gitee.com/liumou_site/logger"
)

// Write 写入HOSTS文件，保留原始注释
func (h *Hosts) Write() error {
	// 确保目录存在
	dir := filepath.Dir(h.File)
	if err := os.MkdirAll(dir, 0755); err != nil {
		logger.Error("创建目录失败: ", err.Error())
		return err
	}

	// 以写模式打开文件
	file, err := os.OpenFile(h.File, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
	if err != nil {
		logger.Error("打开hosts文件写入失败: ", err.Error())
		return err
	}
	defer func() {
		if err := file.Close(); err != nil {
			logger.Error("关闭hosts文件失败: ", err.Error())
		}
	}()

	// 先写入所有注释行
	for _, comment := range h.CommentLines {
		_, err := fmt.Fprintln(file, comment)
		if err != nil {
			logger.Error("写入注释行失败: ", err.Error())
			return err
		}
	}

	// 如果有注释行并且有记录，添加一个空行分隔
	if len(h.CommentLines) > 0 && len(h.RecordList) > 0 {
		if _, err := fmt.Fprintln(file); err != nil {
			logger.Error("写入空行失败: ", err.Error())
			return err
		}
	}

	// 写入有效记录
	for _, v := range h.RecordList {
		_, err := fmt.Fprintf(file, "%s\t%s\n", v.Ip, v.Domain)
		if err != nil {
			logger.Error("写入记录失败: ", err.Error())
			return err
		}
	}

	logger.Info("写入hosts文件成功，共写入", len(h.RecordList), "条记录和", len(h.CommentLines), "条注释")
	return nil
}
